package com.shujia.core

import org.apache.spark.{SparkConf, SparkContext}

object Demo15Acc {

  def main(args: Array[String]): Unit = {


    //1、创建spark配置文件对象
    val conf = new SparkConf()
    // 运行方式
    conf.setMaster("local") //本地运行
    conf.setAppName("WordCount") //程序名


    //2、创建spark上下文对象
    val sc = new SparkContext(conf)

    val studentRDD = sc.textFile("data/student.txt")


    var sum = 0
    studentRDD.foreach(line => {
      //在Executor端对Drriver变量进行修改并不会体现在Driver端  因为Executor端的这个变量只是一个副本
      sum = sum + 1
    })

    //打印0
    println(sum)

    //使用累加器

    //定义累加器
    val acc = sc.accumulator(0)

    studentRDD.foreach(line => {

      //在Executor端进行累加
      acc.add(1)
    })

    //在Driver获取累加器的累加结果
    val count = acc.value

    println(count)

    /**
      * 累加器使用注意
      * 1、累加器只能在Driver端定义
      * 2、只能在Executor端累加
      * 3、只能在Driver读取
      *
      *
      * 广播变量使用注意
      * 1、广播变量只能在Driver定义
      * 2、广播变量只能在Executor端使用。不能修改
      *
      */

  }
}
